package utils

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"errors"
)

// DecryptPhoneNumber 使用AES-128-CBC算法解密微信手机号
// sessionKey: 微信登录返回的session_key
// encryptedData: 加密的手机号数据
// ivB64: Base64编码的IV
func DecryptPhoneNumber(sessionKey, encryptedData, ivB64 string) (string, error) {
	// 解码session_key
	sessionKeyBytes, err := base64.StdEncoding.DecodeString(sessionKey)
	if err != nil {
		return "", errors.New("session_key解码失败: " + err.Error())
	}

	// 解码加密数据
	encryptedBytes, err := base64.StdEncoding.DecodeString(encryptedData)
	if err != nil {
		return "", errors.New("encryptedData解码失败: " + err.Error())
	}

	// 解码IV
	ivBytes, err := base64.StdEncoding.DecodeString(ivB64)
	if err != nil {
		return "", errors.New("iv解码失败: " + err.Error())
	}

	// 创建AES cipher
	block, err := aes.NewCipher(sessionKeyBytes)
	if err != nil {
		return "", errors.New("创建AES cipher失败: " + err.Error())
	}

	// 创建CBC解密器
	mode := cipher.NewCBCDecrypter(block, ivBytes)

	// 解密
	mode.CryptBlocks(encryptedBytes, encryptedBytes)

	// 去除PKCS#7填充
	plaintext := pkcs7Unpad(encryptedBytes)
	if plaintext == nil {
		return "", errors.New("去除填充失败")
	}

	return string(plaintext), nil
}

// pkcs7Unpad 去除PKCS#7填充
func pkcs7Unpad(data []byte) []byte {
	if len(data) == 0 {
		return nil
	}

	padding := int(data[len(data)-1])
	if padding > len(data) {
		return nil
	}

	return data[:len(data)-padding]
}
